// 数组去重
const uniqueArr = (arr) => [...new Set(arr)];
  // eg： uniqueArr(["前端","js","html","js","css","html"])
  //      ['前端', 'js', 'html', 'css']


// 从url获取参数并转为对象
const getParameters = 
        URL => JSON.parse(`{"${decodeURI(URL.split("?")[1]).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"')}"}`)
  // eg： getParameters("https://www.google.com.hk/search?q=js+md&newwindow=1");
  //      {q: 'js+md', newwindow: '1'}


// 检查对象是否为空
const isEmpty = obj => Reflect.ownKeys(obj).length === 0 && obj.constructor === Object;
  // eg： isEmpty({}) // true
  //      isEmpty({a:"not empty"}) //false

  
// 反转字符串
const reverse = str => str.split('').reverse().join('');
  // eg： reverse('this is reverse');
  //      esrever si siht


// 生成随机十六进制
const randomHexColor = () => `#${Math.floor(Math.random() * 0xffffff).toString(16).padEnd(6, "0")}`
  // eg:  randomHexColor()
  //      #a2ce5b


// 检查当前选项卡是否在后台
// 浏览器使用选项卡式浏览，任何网页都有可能在后台,此时对用户来说是没有在浏览的, 知道怎么快速检测到，你的网页对用户是隐藏还是可见吗？
const isTabActive = () => !document.hidden; 
  // eg:  isTabActive()
  //      true|false


// 检测元素是否处于焦点
// activeElement 属性返回文档中当前获得焦点的元素。
const elementIsInFocus = (el) => (el === document.activeElement);
  // eg:  elementIsInFocus(anyElement)
  //      元素处于焦点返回true，反之返回false


// 检查设备类型
// 使用navigator.userAgent 判断是移动设备还是电脑设备：
const judgeDeviceType = 
        () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|OperaMini/i.test(navigator.userAgent) ? 'Mobile' : 'PC';
  // eg:  judgeDeviceType()  
  //      PC | Mobile


// 文字复制到剪贴板
// Clipboard API 它的所有操作都是异步的，返回 Promise 对象，不会造成页面卡顿。而且，它可以将任意内容（比如图片）放入剪贴板。
const copyText = async (text) => await navigator.clipboard.writeText(text)
  // eg:  copyText('单行代码 前端世界')


// 获取选定的文本
// 使用内置的 getSelection 获取用户选择的文本:
const getSelectedText = () => window.getSelection().toString();
  // eg:  getSelectedText();
  //      返回选中的内容


// 查询某天是否为工作日
const isWeekday = (date) => date.getDay() % 6 !== 0;
  // eg:  isWeekday(new Date(2022, 03, 11))
  //      true


// 转换华氏/摄氏
  // 将华氏温度转换为摄氏温度
const fahrenheitToCelsius = (fahrenheit) => (fahrenheit - 32) * 5/9;
  // 将摄氏温度转华氏温度
const celsiusToFahrenheit = (celsius) => celsius * 9/5 + 32;


// 两日期之间相差的天数
const dayDiff = (date1, date2) => Math.ceil(Math.abs(date1.getTime() - date2.getTime()) / 86400000);
  // eg:  dayDiff(new Date("2021-10-21"), new Date("2022-02-12"))
  //      Result: 114


// 将 RGB 转换为十六进制
const rgbToHex = (r, g, b) =>   "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
  // eg:  rgbToHex(255, 255, 255); 
  //      #ffffff


// 计算数组平均值
const average = (arr) => arr.reduce((a, b) => a + b) / arr.length;
  // eg:  average([1,9,18,36]) 
  //      16